/**
 * RGB、人体红外、光敏电阻 实验板
 *  三色LED——PWM占空比控制颜色
    * GPIO10: 红
    * GPIO11: 绿
    * GPIO12: 蓝 对应pwm通道1-3 可改变亮度
  * 光敏电阻——ADC采集值和电压对应，电压和电阻对应，电阻和光照强度对应
     GPIO09: ADC4 ，
          实测ADC值变化不大，电平：无光-1 有光-0
  * 人体红外传感器——ADC采集值反应是否有人靠近
  *  GPIO07: ADC3
  *       实测ADC值变化不大，电平：有人-1 无人-0 且传感器自带延时采集的。
  * 
  * 程序功能：
  *   1.采集光敏电阻、人体红外传感器的ADC值、电平；
  *   2.PWM控制RGB灯；
  *   3.有人靠近时，R-红灯最亮； 有光时G-绿灯最暗，无光时G-绿灯最亮。
  *     无人靠近时，RG-均暗 B-亮
  * 
  * 基于canary2.0 开发。 Code By：HelloKun 2021.09.25
 * */

#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"

#include "iot_gpio.h"
#include "hi_io.h"  //==hi_io_set_func()、hi_io_set_pull()
#include "iot_pwm.h"
#include "hi_pwm.h"
#include "hi_adc.h" //==hi_adc_read()

#define RED_led  1
#define GREEN_led 2
#define BLUE_led 3  //RGB-PWM通道

static void RgbTask(void *arg)
{
    (void)arg;
   unsigned int value_9, value_7;
   IotGpioValue data_9, data_7;
    while(1)
    {
        /*if(hi_adc_read(HI_ADC_CHANNEL_4,&value_9,HI_ADC_EQU_MODEL_1,HI_ADC_CUR_BAIS_DEFAULT, 0)==0)
        {
            printf("value_9=%d\n",value_9);
        }
        if(hi_adc_read(HI_ADC_CHANNEL_3,&value_7,HI_ADC_EQU_MODEL_4,HI_ADC_CUR_BAIS_DEFAULT, 0)==0)
        {
            printf("value_7=%d\n",4*1.8*value_7/4096);
        }*/ //采集ADC值
        IoTGpioGetInputVal(9,&data_9);
        IoTGpioGetInputVal(7,&data_7); //采集电位
        printf("data_9:%d\n",data_9);
        printf("data_7:%d\n",data_7);
    
        usleep(50*1000);
        if((data_9==1)&&(data_7==1)) { //有人无光
            IoTPwmStart(GREEN_led,90,64000);}
        if((data_9==0)&&(data_7==1)){  //有人有光
            IoTPwmStart(GREEN_led,10,64000);}
        if(data_7==1){  //有人
            usleep(50*1000);
            IoTPwmStart(RED_led,90,64000);
            IoTPwmStart(BLUE_led,10,64000);}
        if((data_7==0)){//无人
            IoTPwmStart(RED_led,10,64000);
            IoTPwmStart(GREEN_led,10,64000);
            IoTPwmStart(BLUE_led,90,64000); //PWM控制灯亮度
        }
    }

}

static void RgbEntry(void)
{
    osThreadAttr_t attr;

    IoTGpioInit(9);
    IoTGpioSetDir(9,IOT_GPIO_DIR_IN);
    hi_io_set_func(9,HI_IO_FUNC_GPIO_9_GPIO);
    IoTGpioInit(7);
    IoTGpioSetDir(7,IOT_GPIO_DIR_IN);
    hi_io_set_func(7,HI_IO_FUNC_GPIO_7_GPIO);

    IoTGpioInit(10);
    //IoTGpioSetDir(10,IOT_GPIO_DIR_OUT);
    hi_io_set_func(10,HI_IO_FUNC_GPIO_10_PWM1_OUT);
    IoTPwmInit(RED_led);

    IoTGpioInit(11);
    //IoTGpioSetDir(11,IOT_GPIO_DIR_OUT);
    hi_io_set_func(11,HI_IO_FUNC_GPIO_11_PWM2_OUT);
    IoTPwmInit(GREEN_led);

    IoTGpioInit(12);
    //IoTGpioSetDir(12,IOT_GPIO_DIR_OUT);
    hi_io_set_func(12,HI_IO_FUNC_GPIO_12_PWM3_OUT);
    IoTPwmInit(BLUE_led);

    attr.name = "RgbTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_size = 4096;
    attr.priority = 24;

    if(osThreadNew(RgbTask,NULL,&attr) == NULL){
        printf("[RgbEntry] Failed to create RgbTask!\n");
     }

}
APP_FEATURE_INIT(RgbEntry);

/**
 * 总结：
 * 1. 各GPIO接口使用函数IoTGpioInit(pinID) 初始化时，默认gpio是什么功能?
 * 2. 实测GPIO-9 默认是串口，
 * 3. 初始化GPIO为pwm、i2c、adc、普通io的具体操作
 *   -pwm： IoTGpioInit(pinID);
 *          hi_io_set_func(pinID,HI_IO_FUNC_GPIO_pinID_PWMx_OUT); 
 *          IoTPwmInit(PWMx);
 *          IoTPwmStart(PWMx,duty.freq);
 * 
 *   -adc   IoTGpioInit(pinID);
 *          IoTGpioSetDir(pinID,IOT_GPIO_DIR_IN);
 *          hi_io_set_func(pinID,HI_IO_FUNC_GPIO_pinID_GPIO);
 *          可选，上拉等：
 *                      //IoSetPull(pinID, HI_IO_PULL_UP);
 *                      hi_io_set_pull(pinID,HI_IO_PULL_UP);
 *          hi_adc_read(HI_ADC_CHANNEL_0-7,&data,HI_ADC_EQU_MODEL_1-2-4-8,HI_ADC_CUR_BAIS_DEFAULT, 0);
 * 
 *   -io  IoTGpioInit(pinID);
 *          IoTGpioSetDir(pinID,IOT_GPIO_DIR_IN);
 *          IoTGpioGetInputVal(pinID,&value);
 * 
 *          IoTGpioSetDir(pinID,IOT_GPIO_DIR_OUT);
 *          IoTGpioSetOutputVal(pinID,0-1);
 * 
 * 
 * 
 */ 
